// 导航守卫
import router from './router'
import store from './store'
router.beforeEach(async(to, from, next) => {
  // to:去哪里 跳转的目标路由对象
  // from 从哪里来 当前的目标路由对象
  // next：放行函数
  // 获取vuex模块中的变量语法：store.state.模块名.变量名
  const token = store.state.user.token
  if (token) {
    // 已登录---判断跳转的页面是否为登录页，是则跳转到首页否则放行
    if (to.path === '/login') {
      next('/')
    } else {
      // 为了保证先获取到数据，在进入页面，因此我们可以把调用actions函数的代码写在导航守卫中
      // 并且使用await等待数据获取成功再进入页面
      if (!store.state.user.userInfo.data) {
        // 判断只有用户信息不存在的时候才需要重新调用函数获取用户信息
        await store.dispatch('user/getUserInfo')
      }
      next()
      if (!store.state.user.userInfo.id) {
        await store.dispatch('user/getUser')
        const menus = store.getters.menus
        const routes = await store.dispatch('permission/filterRoutes', menus)
        router.addRoutes([...routes, { path: '*', redirect: '/404', hidden: true }])
        next(to.path)
      } else {
        next()
      }
      // const menus = store.state.permission.routes
    }
  } else {
    // 未登录---404页面和登录页面 直接放行，否则跳转登录页面
    const writeArr = ['/login', '/404', '/register']// 添加白名单 所有在白名单中的路径都可以直接放行
    // indexOf方法：用于查找数组中是否存在 存在则返回对应下标，不存在则返回-1
    if (writeArr.indexOf(to.path) !== -1) {
      next()
    } else {
      next('/login')
    }
  }
})
